Ga naar hoofdinhoud

Geplande MQTT-besturing

tip

De Geplande MQTT-besturing is bedoeld voor geplande berichten van tevoren. Voor live besturing, zie in plaats daarvan Live MQTT Control.

Deze gids helpt je bij het configureren van MQTT op je SmartgridOne Controller om op afstand batterij- en zonnepaneelinstallaties te bedienen en te monitoren.

Wat je nodig hebt

  1. SmartgridOne Controller met internetverbinding.
  2. MQTT-gegevens: Deze kunnen worden aangevraagd door een e-mail te sturen naar support@eniris.be.
  3. Python-ontwikkelomgeving (of een andere MQTT-client). Deze gids gebruikt een basisvoorbeeld geschreven in Python om je te helpen met MQTT en het verzenden van opdrachten. We raden aan om Python te gebruiken voor het gebruiksgemak, maar elke andere MQTT-client wordt ondersteund.

Extra informatie

MQTT is een snel communicatieprotocol via internet. Het is een publiceer/abonneerberichtensysteem, dat een directe verbinding tussen jouw machine en de SmartgridOne Controller mogelijk maakt. Je activa zijn geclassificeerd in groepen zonne-energie, batterij, EV en HVAC. Op dit moment staat deze integratie besturing per groep toe, niet per apparaat.

Eerste configuratie (Startpunt voor nieuwe gebruikers)

Ik heb een SmartgridOne Controller die ik wil instellen voor MQTT Remote Control.

1. Controleer je netwerk

Zorg ervoor dat je netwerk mqtt-netwerkverkeer over poort 1883 toestaat. Dit kun je doen met het volgende commando:

nc -zv mqtt.eniris.be 1883

Wanneer dit commando niet beschikbaar is, kun je alternatieve deze python code downloaden en uitvoeren.

Als je twijfelt, raadpleeg dan je netingenieur of gebruik tijdelijk de 4G/5G-hotspot van je telefoon wanneer er verbindingsfouten optreden.

notitie

Wanneer poort 1883 niet toegankelijk is vanaf je netwerk, bieden we een backup op poort 80. Dit kan later in deze handleiding in je MQTT-client worden geconfigureerd.

2. Voeg je apparaten toe

Log in op de inbedrijfstellingsinterface en zorg ervoor dat de apparaten zijn toegevoegd aan de SmartgridOne Controller.

3. Voeg het MQTT externe signaal toe

Afbeelding 1
Afbeelding 1
Afbeelding 1

4. Schakel MQTT extern signaal in

Selecteer alle apparaten die je wilt opnemen in MQTT Remote Control.

Afbeelding 1

5. Extern signaal is toegevoegd

De MQTT Remote Control-interface is nu geactiveerd op de SmartgridOne Controller.

We zijn nu klaar om enkele basisopdrachten te verzenden met een eenvoudig voorbeeld. De Status-kolom geeft aan of een opdracht actief is.

Python demo-script

Een goed startpunt zou zijn om je nieuw ingestelde integratie te testen met een eenvoudig voorbeeld.

Deze testcode doet een eenvoudige taak door continu de volgende planning te verzenden:

  • Batterij: Opladen met 5 kW gedurende 15 minuten in 10 minuten
  • Zonne-energie: Stel het vermogen in op 0 kW gedurende een uur in 30 minuten

De SmartgridOne Controller reageert met een bevestigingsbericht dat de unieke planningsidentifier bevat, of een foutmelding.

We halen vervolgens de volgende planning op voor beide apparaatssoorten, waarmee we bevestigen dat de opdracht succesvol was.

Download het onderstaande bestand in je favoriete Python IDE. Vul je serienummer en MQTT-gegevens in en voer het script uit:

Wanneer het bovenstaande succesvol is, kun je doorgaan met het verzenden van andere soorten berichten. Alle berichten worden hieronder beschreven.

MQTT Documentatie voor het Verzenden van Opdrachten

Dit gedeelte beschrijft het MQTT-berichtformaat en de payloadvereisten voor het instellen van geplande besturing van apparaten binnen het netwerk van de SmartgridOne Controller.

MQTT Onderwerpen

  • Abonneer Onderwerp: standard1/rp_one_s/remoteScheduleMetrics/<controller SN>
  • Feedback Onderwerp: standard1/outbound/remoteScheduleMetrics/feedback/<controller SN>

Waarbij <controller SN> moet worden vervangen door het daadwerkelijke serienummer van de SmartgridOne Controller die je wilt bedienen.

MQTT Berichten Types

1. Stel Planning In (set_schedule)

Maakt een nieuwe planning voor een apparaatssoort aan.

{
"extraTags": {
"nodeId": "<Controller SN>_site_0"
},
"time": <Unix Timestamp>,
"message_type": "set_schedule",
"fields": {
"device_type": "<Device Type>",
"node_id": "<Node ID>" (Optioneel),
"start_time": <Unix Timestamp>,
"end_time": <Unix Timestamp>,
"policy": "<Policy>",
"power_setpoint_w": <Setpoint in watts>,
"site_import": <Site Import in Watts>,
"site_export": <Site Export in Watts>,
"remove_overlap": <True/False> (Optioneel) (default=False),
"tag": <Tag String> (Optioneel) (default=None),
}
}

Respons (Succes):

{
"requestTime": <Unix Timestamp>,
"time": <Unix Timestamp>,
"siteNodeId": "<Controller SN>_site_0",
"data": {
"message_type": "set_schedule_ack",
"state": {
"schedule_id": <Schedule ID>,
"deleted_ids": <Schedulde IDs verwijderd als remove_overlap=True>
"tag": <Tag String> (default=None),
},
"responseCode": 0
}
}

2. Stel Planningen In (set_schedules)

Maakt meerdere nieuwe planningen aan.

{
"extraTags": {
"nodeId": "<Controller SN>_site_0"
},
"time": <Unix Timestamp>,
"message_type": "set_schedules",
"fields":
"0": '{
"device_type": "<Device Type>",
"node_id": "<Node ID>" (Optioneel),
"start_time": <Unix Timestamp>,
"end_time": <Unix Timestamp>,
"policy": "<Policy>",
"power_setpoint_w": <Setpoint in watts>,
"site_import": <Site Import in Watts>,
"site_export": <Site Export in Watts>,
"remove_overlap": <True/False> (Optioneel) (default=False),
}',
"1": '{
"device_type": "<Device Type>",
"node_id": "<Node ID>" (Optioneel),
"start_time": <Unix Timestamp>,
"end_time": <Unix Timestamp>,
"policy": "<Policy>",
"power_setpoint_w": <Setpoint in watts>,
"site_import": <Site Import in Watts>,
"site_export": <Site Export in Watts>,
"remove_overlap": <True/False> (Optioneel) (default=False),
}',
...
}

Respons (Succes):

{
"requestTime": <Unix Timestamp>,
"time": <Unix Timestamp>,
"siteNodeId": "<Controller SN>_site_0",
"data": {
"message_type": "set_schedules_ack",
"state": {
"schedule_ids": <Schedule IDs>,
"deleted_ids": <Schedulde IDs verwijderd als remove_overlap=True>
},
"responseCode": 0
}
}

3. Verkrijg Planning (get_schedule)

Haal een specifieke planning op via ID.

{
"extraTags": {
"nodeId": "<Controller SN>_site_0"
},
"time": <Unix Timestamp>,
"message_type": "get_schedule",
"fields": {
"id": <Schedule ID>
}
}

Respons:

{
"requestTime": <Unix Timestamp>,
"time": <Unix Timestamp>,
"siteNodeId": "<Controller SN>_site_0",
"data": {
"message_type": "get_schedule_ack",
"state": <Schedule>,
"responseCode": 0
}
}

4. Verkrijg Actieve Planning (get_active_schedule)

Haal de momenteel actieve planning op voor een apparaattype.

{
"extraTags": {
"nodeId": "<Controller SN>_site_0"
},
"time": <Unix Timestamp>,
"message_type": "get_active_schedule",
"fields": {
"device_type": "<Device Type>",
"node_id": "<Node ID>" (Optioneel),
}
}

Antwoord (Succes):

{
"requestTime": <Unix Timestamp>,
"time": <Unix Timestamp>,
"siteNodeId": "<Controller SN>_site_0",
"data": {
"message_type": "get_active_schedule_ack",
"state": <Schedule>,
"responseCode": 0
}
}

5. Verkrijg Volgende Planning (get_next_schedule)

Haal de volgende aankomende planning op voor een apparaat type.

{
"extraTags": {
"nodeId": "<Controller SN>_site_0"
},
"time": <Unix Timestamp>,
"message_type": "get_next_schedule",
"fields": {
"device_type": "<Device Type>",
"node_id": "<Node ID>" (Optioneel),
}
}

Antwoord (Succes):

{
"requestTime": <Unix Timestamp>,
"time": <Unix Timestamp>,
"siteNodeId": "<Controller SN>_site_0",
"data": {
"message_type": "get_next_schedule_ack",
"state": <Schedule>,
"responseCode": 0
}
}

6. Verkrijg Planningen (get_schedules)

Haal alle planningen op voor een specifieke datum.

{
"extraTags": {
"nodeId": "<Controller SN>_site_0"
},
"time": <Unix Timestamp>,
"message_type": "get_schedules",
"fields": {
"date": "<Date String of Format dd/mm/yyyy>"
}
}

Antwoord (Succes):

{
"requestTime": <Unix Timestamp>,
"time": <Unix Timestamp>,
"siteNodeId": "<Controller SN>_site_0",
"data": {
"message_type": "get_schedules_ack",
"state": {
"schedules": [<Schedule>, ...]
},
"responseCode": 0
}
}

7. Verkrijg Toekomstige Planningen (get_future_schedules)

Haal alle toekomstige planningen op.

{
"extraTags": {
"nodeId": "<Controller SN>_site_0"
},
"time": <Unix Timestamp>,
"message_type": "get_future_schedules",
"fields": {}
}

Antwoord (Succes):

{
"requestTime": <Unix Timestamp>,
"time": <Unix Timestamp>,
"siteNodeId": "<Controller SN>_site_0",
"data": {
"message_type": "get_future_schedules_ack",
"state": {
"schedules": [<Schedule>, ...]
},
"responseCode": 0
}
}

8. Verwijder Planning (remove_schedule)

Verwijder een specifieke planning op basis van ID.

{
"extraTags": {
"nodeId": "<Controller SN>_site_0"
},
"time": <Unix Timestamp>,
"message_type": "remove_schedule",
"fields": {
"id": <Schedule ID>
}
}

Antwoord (Succes):

{
"requestTime": <Unix Timestamp>,
"time": <Unix Timestamp>,
"siteNodeId": "<Controller SN>_site_0",
"data": {
"message_type": "remove_schedule_ack",
"state": "Planning <Schedule ID> succesvol verwijderd",
"responseCode": 0
}
}

9. Verkrijg Feedback van de Site (get_feedback)

Haal gedetailleerde feedback over de staat van het systeem op.

{
"extraTags": {
"nodeId": "<Controller SN>_site_0"
},
"time": <Unix Timestamp>,
"message_type": "get_feedback",
"fields": {
"device": <Device (node) level>
}
}

Antwoord (Succes):

Feedback Payload Structuur

10. Topologie van de Site (get_toplogy)

Krijg de topologie van de site.

{
"extraTags": {
"nodeId": "<Controller SN>_site_0"
},
"time": <Unix Timestamp>,
"message_type": "get_topology",
"fields": {}
}

Antwoord (Succes):

{
"requestTime": <Unix Timestamp>,
"time": <Unix Timestamp>,
"siteNodeId": "<Controller SN>_site_0",
"data": {
"message_type": "get_topology_ack",
"state": {
"nodeId": <nodeId>,
"nodeType": <nodeType>,
"nomCurrent": <nominalCurrent>
"children": [{<ChildObject>}]
},
"responseCode": 0
}
}

Standaard Antwoordformaat voor Planningen

{
"id": <Schedule ID>,
"device_type": "<Device Type>",
"node_id": "<Node ID>" (Optioneel),
"start_time": <Unix Timestamp>,
"end_time": <Unix Timestamp>,
"policy": "<Schedule Policy>",
"power_setpoint_w": <Setpoint in watts>,
"created_at": <Unix Timestamp>
}

Componenttypen en Beleidsregels

Voor details over beschikbare componenten en beleidsregels die kunnen worden ingepland, raadpleeg de MQTT Componenten en Beleidsregels sectie in de Live MQTT Control documentatie.

Apparaatspecifieke planningen kunnen worden verzonden met behulp van het optionele node_id veld, dat verwijst naar de node-ID van het controleerbare apparaat.

Foutafhandeling

Alle berichten kunnen een foutantwoord retourneer met responseCode: 1 wanneer er een fout optreedt:

{
"requestTime": <Unix Timestamp>,
"time": <Unix Timestamp>,
"siteNodeId": "<Controller SN>_site_0",
"data": {
"message_type": "<Message Type>_ack",
"error": <Error Body>,
"responseCode": 1
}
}

Wanneer er een niet-gerelateerde fout optreedt, zal het berichttype (general_error) zijn.

Veelvoorkomende fouten zijn:

  • Overlap van planningen met bestaande planningen
  • Ongeldig tijdsbestek
  • Apparaat type niet gevonden
  • Planning ID niet gevonden
  • Ongeldige beleidsregel voor apparaattype

Regels voor Planningbeheer

  1. Overlapregels
    • Planningen kunnen niet overlappen voor hetzelfde apparaattype
    • Planningen kunnen niet overlappen voor hetzelfde apparaat
    • Planningen voor hetzelfde apparaat en apparaattype kunnen niet overlappen
    • Bestaande, overlappende planningen worden verwijderd als de remove_overlap variabele is ingesteld op True bij het aanmaken van een nieuwe planning.
  2. Elke planning moet hebben:
    • Een geldig apparaattype
    • Een starttijd (Unix timestamp)
    • Een eindtijd (Unix timestamp)
    • Een beleidsregel (die overeenkomt met de beschikbare beleidsregels van het apparaattype)
    • Een energie-instelling (voor beleidsregels die dit vereisen)
  3. De starttijd moet vóór de eindtijd liggen
  4. Als de starttijd in het verleden ligt, wordt deze automatisch gewijzigd om nu te starten
  5. Planningen kunnen alleen worden verwijderd als ze nog niet zijn begonnen. Actieve planningen kunnen niet worden verwijderd.
  6. Planningen kunnen onafhankelijk worden ingesteld voor verschillende apparaattype's
  7. Het systeem past automatisch de juiste beleidsregel toe wanneer een planning actief wordt